#ifndef WIDGET_H
#define WIDGET_H
#include "mylabel.h"
#include "DataItem.h"

#include <typeinfo>
#include <QWidget>
#include <QTcpServer>
#include <QNetworkInterface>
#include <QHostInfo>
#include <QVBoxLayout>
#include <QRegularExpression>
#include <QTextEdit>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //协议类型获取
    void getNetworkType();

    //获取本机的IP地址
    void getHostAddrIp_1();
    void getHostAddrIp_2();


private slots:
    //label保存数据
    void OnLabelSaveData();
    //label清除数据
    void OnLabelClearData();
    //label加载数据
    void OnLabelLoadFile();
    //label清理输入
    void OnLabelClearInput();
    //TcpServer有新的连接
    void OnnewConnection();

    //已经连接
    void OnTcpServerconnected();

    //TcpServer 的readyRead信号对应的槽函数。
    void OnTcpServerReadyRead();

    //当有客户端断开连接
    void OnTcpServerdisconnected();

    //////////////////////////////////////////////
    //客户端 start
    //////////////////////////////////////////////


    //客户端连接后
    void OnTcpClientconnected();
    //客户端断开连接
    void OnTcpClientdisconnected();
    //客户端读取数据
    void OnTcpClientreadyRead();


    //客户端 end
    //////////////////////////////////////////////


    //////////////////////////////////////////////
    //界面对应的控件的槽函数   start
    //////////////////////////////////////////////


    void on_comboBox_PotocolType_currentIndexChanged(int index);

    void on_comboBox_ClientPort_currentIndexChanged(int index);

    void on_pushButton_link_clicked();

    void on_pushButtonSend_clicked();

    void on_checkBox_DisRevTime_clicked(bool checked);

    void on_checkBox_HexDis_clicked(bool checked);

    void on_checkBox_NextRow_clicked(bool checked);

    void on_checkBox_SendClear_clicked(bool checked);

    void on_checkBox_SendPeriod_clicked(bool checked);

    void on_checkBox_HexSend_clicked(bool checked);

    //界面对应的控件的槽函数   end
    //////////////////////////////////////////////



    void on_pushButtonReset_clicked();

public:
    //辅助函数

    //正常IP地址匹配
    bool isValidIPv4(const QString &ip);

    //获取对应的客户端socket的端口号
    quint16 getTcpClientPort(QTcpSocket* sock);

    // 添加接收消息
    void appendReceivedMessage(QTextEdit *plainTextEdit, const QString &message);

    // 添加发送消息
    void appendSentMessage(QTextEdit *plainTextEdit, const QString &message);

    QString getCurTime();

    //依据不同的数据类型，保存数据  norm 和 hex
    template<class T>
    void saveData(T t1,QString time,QString csType);

    //将消息块重置为默认
    void resetCuror(QTextEdit *textEdit);
    //移除块
    void removeBlocks(QTextEdit *textEdit);
    //获取全部块
    void getAllBlocks(QTextEdit *textEdit);
    //删除空的块
    void delEmptyBlocks(QTextEdit *textEdit);
    //发送类型的选择
    void sendTypeSelect(int sendtype,QString& name,QString& msg);
    //正常文本转化为hex
    QString NormDataToHexData(QString &normData);
    //发送/接收大小重置
    void resetSendorRevSize();
private:
    Ui::Widget *ui;

    QList<DataItem> normData;
    QList<DataItem> HexData;
    QList<QString> allText;

    int disRev;                 //显示类型  1.按时间yes/no  2.按16进制yes/no

    QTcpServer *TcpServer;      //服务器
    QTcpSocket *tcpSocket;      //服务器新的连接获取的socket

    QVBoxLayout *vLayoutNetworkType;     //获取协议类型的布局方式，根据协议不同，设置不同的展示。
    QHash<QTcpSocket*,quint16> hashClients;  //存放所连接服务器的客户端。
    bool stateListen;       //服务器的监听状态  开始监听   /  停止监听

    int NetworkType;        //协议类型标志位  TcpServer  /  TcpClient  /Udp
    int btnType;            //按钮类型  监听 / 连接

    QTcpSocket *tcpClient;  //客户端的QTcpSocket
    bool stateLink;         //客户端的连接状态  开始连接  /   断开连接



    int sendType;  //发送类型判定  1.发送完自动清空yes/no  2.按十六进制发送yes/no

    QTimer *timer;

    int sendSize;
    int revSize;
};
#endif // WIDGET_H
